/**
 * cargo  script -d rand 2.1guessGame.rs
 */
extern crate rand;
use std::io;
use rand::{thread_rng, Rng};
use std::cmp::Ordering;
fn main(){
	println!("猜猜数字");
	let secret_str =rand::thread_rng().gen_range(1..101);
	//let s: String = secretStr.to_string();
	println!("输入猜测的次数");
	let mut gts=String::new();
	io::stdin().read_line(&mut gts).expect("读取失败");
	let gts: u32=gts.trim().parse().expect("请输入一个数字");
	
	println!("请输入你的猜测.如果要退出");	
	// mut 可变变量。否则默认是不可变的
	//::表示命名空间，这点和C++是类似的。
	//用于访问路径（Path），通常用于访问模块、结构体、枚举等中的项，包括函数、常量、类型别名等。
	//这是Rust中命名空间管理的一种方式，称为“路径限定”（Path Qualification）	
	
	
	let mut is_ok=false;
	let mut try_times :u32=0;
	for i in (0..gts).rev(){
		let mut guess=String::new();
		//&mut guess表示应用参数，而不是引用值。 这个写法稍微复杂了，JAVA不会这个麻烦,是不是考虑简化下?
		//read_line返回一个 std::result.Result
		io::stdin().read_line(&mut guess).expect("读取失败");
		
		//rust居然可以重新定义变量类型，这个不太习惯，搞得有点像js的变量
	    let guess: u32=guess.trim().parse().expect("请输入一个数字");
		
		//这个println!方法好，类似java的log4j
		println!("你猜测的数字:{}",guess);
		try_times=try_times+1;
		//判断被猜测的字符串是否等于我们猜测的数字，如果是则输出一条ok。
		//如果传参不带&会怎么样？
		//match 就是java的switch	
		match guess.cmp(&secret_str){
			Ordering::Less => println!("偏小"),
			Ordering::Greater => println!("偏大"),
			Ordering::Equal => {println!("恭喜，你赢了!你总共花费了{}次",try_times);is_ok=true;}
		};
		
		if is_ok{
			break;
		}
	}
	
	println!("秘密数字是:{}", secret_str);
}